// tslint:disable:comment-format binary-expression-operand-order max-line-length
// tslint:disable:no-bitwise prefer-template cyclomatic-complexity
// tslint:disable:no-shadowed-variable switch-default prefer-const
// tslint:disable:one-variable-per-declaration newline-before-return

import { LocaleData } from '../locale/locale.class';

//! moment.js locale configuration
//! locale : Czech [cs]
//! author : petrbela : https://github.com/petrbela

const months: string[] = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_');
const monthsShort: string[] = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');

function plural(num: number): boolean {
  return (num > 1) && (num < 5) && (~~(num / 10) !== 1);
}

function translate(num: number, withoutSuffix: boolean, key: string, isFuture: boolean): string {
  const result = num + ' ';

  switch (key) {
    case 's':  // a few seconds / in a few seconds / a few seconds ago
      return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
    case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
      if (withoutSuffix || isFuture) {
        return result + (plural(num) ? 'sekundy' : 'sekund');
      } else {
        return result + 'sekundami';
      }
    // break;
    case 'm':  // a minute / in a minute / a minute ago
      return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
    case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
      if (withoutSuffix || isFuture) {
        return result + (plural(num) ? 'minuty' : 'minut');
      } else {
        return result + 'minutami';
      }
    // break;
    case 'h':  // an hour / in an hour / an hour ago
      return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
    case 'hh': // 9 hours / in 9 hours / 9 hours ago
      if (withoutSuffix || isFuture) {
        return result + (plural(num) ? 'hodiny' : 'hodin');
      } else {
        return result + 'hodinami';
      }
    // break;
    case 'd':  // a day / in a day / a day ago
      return (withoutSuffix || isFuture) ? 'den' : 'dnem';
    case 'dd': // 9 days / in 9 days / 9 days ago
      if (withoutSuffix || isFuture) {
        return result + (plural(num) ? 'dny' : 'dní');
      } else {
        return result + 'dny';
      }
    // break;
    case 'M':  // a month / in a month / a month ago
      return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
    case 'MM': // 9 months / in 9 months / 9 months ago
      if (withoutSuffix || isFuture) {
        return result + (plural(num) ? 'měsíce' : 'měsíců');
      } else {
        return result + 'měsíci';
      }
    // break;
    case 'y':  // a year / in a year / a year ago
      return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
    case 'yy': // 9 years / in 9 years / 9 years ago
      if (withoutSuffix || isFuture) {
        return result + (plural(num) ? 'roky' : 'let');
      } else {
        return result + 'lety';
      }
    // break;
  }
}

export const csLocale: LocaleData = {
  abbr: 'cs',
  months,
  monthsShort,
  monthsParse: (function (months, monthsShort) {
    let i, _monthsParse = [];
    for (i = 0; i < 12; i++) {
      // use custom parser to solve problem with July (červenec)
      _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
    }
    return _monthsParse;
  }(months, monthsShort)),
  shortMonthsParse: (function (monthsShort) {
    let i, _shortMonthsParse = [];
    for (i = 0; i < 12; i++) {
      _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i');
    }
    return _shortMonthsParse;
  }(monthsShort)),
  longMonthsParse: (function (months) {
    let i, _longMonthsParse = [];
    for (i = 0; i < 12; i++) {
      _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i');
    }
    return _longMonthsParse;
  }(months)),
  weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
  weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),
  weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),
  longDateFormat: {
    LT: 'H:mm',
    LTS: 'H:mm:ss',
    L: 'DD.MM.YYYY',
    LL: 'D. MMMM YYYY',
    LLL: 'D. MMMM YYYY H:mm',
    LLLL: 'dddd D. MMMM YYYY H:mm',
    l: 'D. M. YYYY'
  },
  calendar: {
    sameDay: '[dnes v] LT',
    nextDay: '[zítra v] LT',
    nextWeek(dayOfWeek: number): string {
      switch (dayOfWeek) {
        case 0:
          return '[v neděli v] LT';
        case 1:
        case 2:
          return '[v] dddd [v] LT';
        case 3:
          return '[ve středu v] LT';
        case 4:
          return '[ve čtvrtek v] LT';
        case 5:
          return '[v pátek v] LT';
        case 6:
          return '[v sobotu v] LT';
      }
    },
    lastDay: '[včera v] LT',
    lastWeek(dayOfWeek: number): string {
      switch (dayOfWeek) {
        case 0:
          return '[minulou neděli v] LT';
        case 1:
        case 2:
          return '[minulé] dddd [v] LT';
        case 3:
          return '[minulou středu v] LT';
        case 4:
        case 5:
          return '[minulý] dddd [v] LT';
        case 6:
          return '[minulou sobotu v] LT';
      }
    },
    sameElse: 'L'
  },
  relativeTime: {
    future: 'za %s',
    past: 'před %s',
    s: translate,
    ss: translate,
    m: translate,
    mm: translate,
    h: translate,
    hh: translate,
    d: translate,
    dd: translate,
    M: translate,
    MM: translate,
    y: translate,
    yy: translate
  },
  dayOfMonthOrdinalParse: /\d{1,2}\./,
  ordinal: '%d.',
  week: {
    dow: 1, // Monday is the first day of the week.
    doy: 4  // The week that contains Jan 4th is the first week of the year.
  }
};

